package com.deco.service.sys;

import com.deco.dao.domain.table.CmsMenu;
import com.deco.domain.vo.constants.CmsConstant;
import com.deco.domain.vo.sys.CmsMenuVo;
import com.deco.logic.sys.CmsMenuLogic;
import com.deco.logic.sys.CmsRoleLogic;
import com.deco.service.CommonService;
import com.free.common.vo.ResultModel;
import com.free.ext.logger.FreeLogger;
import com.free.ext.logger.FreeLoggerFactory;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
@Service
public class CmsMenuService extends CommonService {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/

    @Autowired
    private CmsMenuLogic logic;

    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/

    /**
     * 根据用户角色显示用户菜单
     * @param roles 用户角色
     * @param curMenu 当前菜单
     * @return
     */
    public List<CmsMenuVo> getMenuTreeByRole(String roles,String curMenu){
        return logic.getTreeMenusByRoles(roles,curMenu);
    }

    public ResultModel update(CmsMenuVo menu){
        if(menu.getId() == null || menu.getId() == 0){
            menu.setCreateBy(getCurrentUserId());
            menu.setCreateTime(getCurrentTimeStamp());
            menu = logic.add(menu);
            return ResultModel.success(menu);
        }else{
            ResultModel checkRes = checkByType(menu.getId());
            if(!checkRes.isSuccess()){
                return checkRes;
            }
            menu.setUpdateBy(getCurrentUserId());
            menu.setUpdateTime(getCurrentTimeStamp());
            int res = logic.update(menu);
            if(res > 0){
                return ResultModel.success(menu);
            }
        }
        return ResultModel.failure();
    }

    public ResultModel delete(Integer key){
        ResultModel checkRes = checkByType(key);
        if(!checkRes.isSuccess()){
            return checkRes;
        }
        int res = logic.delete(key);
        if(res > 0){
            return ResultModel.success();
        }
        return ResultModel.failure();
    }

    public List<CmsMenuVo> getRoleTreeMenus(int roleId){return logic.getAllRoleTreeMenus(roleId);}

    public List<CmsMenuVo> getAll(){
        return logic.getAll();
    }

    public List<CmsMenuVo> getTreeMenuByParentId(Integer parentId) {return logic.getAllTreeMenus(parentId);}

    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/

    private ResultModel checkByType(int id){
        CmsMenuVo sysMenu = logic.getById(id);
        if(sysMenu == null){
            return ResultModel.failure(null,"没找到菜单");
        }
        if(sysMenu.getType() == CmsConstant.MENU_TYPE_SYSTEM){
            return ResultModel.failure(null,"系统菜单不能修改");
        }
        return ResultModel.success();
    }
}
